'''
Created on 2012-4-12下午9:40:49

@author: yasenagat
@email:   yasenagat@gmail.com

struct 
由于没有c语言基础，而且E文..，看官方文档，这个部分看的很蛋疼，果断百度。
http://docs.python.org/py3k/library/struct.html
'''
#--看了看，方法很少，重点就两个pack,unpack，还有一个calcsize

#这个官方文档不好的地方，我感觉就是返回值太蛋疼，看半天E问才能看见，到底是什么类型的返回值，非常不直观。
#E文吃了的，直接飘过吧

from struct import *

#一、
#先说说要做什么吧
#我要把1这个数字，按照我自己定的规则打包，然后在解包

#规则
fmt = 'i'
#压缩包
a = pack(fmt,1)
print(a)# 压包后 b'\x01\x00\x00\x00'

#解压缩包
b = unpack(fmt,a)
print(b)# 解包后 (1,)

#用错误的规则解包，报错！！！
#b = unpack('s',a)
print(b)
#struct.error: unpack requires a bytes object of length 1
#需要一个长度为1的字节数组对象

#那么为什么是1呢？
length = calcsize('s')
print(length)
#原来错误的fmt需要的长度是1
#看看争取的需要长度是多少呢
print(calcsize(fmt))# 4,正确的需要长度是4


#二、
#压包多个数据

#是这样的，fmt这个是后写的，你只有只要要压缩的数据类型，才能知道你的fmt
a = pack('4s2sif2s',b'abcd',b'gg',1,23.98,b'hi')
print(a)  # b'abcdgg\x00\x00\x01\x00\x00\x00\n\xd7\xbfAhi'

a = pack('1s2sif2s',b'abcd',b'gg',1,23.98,b'hi')
print(a) # b'agg\x00\x01\x00\x00\x00\n\xd7\xbfAhi'

a = pack('5s2sid2s',b'abcd',b'gg',1,23.98,b'hi')
print(a) # b'abcd\x00gg\x00\x01\x00\x00\x00\x00\x00\x00\x00{\x14\xaeG\xe1\xfa7@hi'

b = unpack('5s2sid2s',a)
print(b) # (b'abcd\x00', b'gg', 1, 23.98, b'hi')

#如果你能看懂，那么你很给力，反正我开始是没看懂

#看懂的略过，没看懂的往下看

#a = pack('4s2sif2s',b'abcd',b'gg',1,23.98,b'hi')
#print(a)  # b'abcdgg\x00\x00\x01\x00\x00\x00\n\xd7\xbfAhi'

#pack(fmt,v1,v2...)
#v1，v2支持的格式入下：

a = pack('4s2sid2s',b'abcd',b'gg',1,23.98,b'hi')
#解压如下：
b = unpack('4s2sid2s',a)
print(b)
print(str(b[0],'utf-8'))

b1,b2,b3,b4,b5 = unpack('4s2sid2s',a)
print(str(b1,'utf-8'))
print(b4)
#a = pack('3i',b'abcd',b'gg',1,23.98,b'hi')

